性能优化
在本页上,我们将向您展示如何为您的设备和应用程序设置基于 Linux 的 CODESYS Control SL 产品,以便尽可能获得最佳性能。
我们为您提供可用于检查和评估系统当前状态的工具。
我们建议采用以下程序。按指定顺序完成这些步骤。如果当前步骤没有按需要进行优化,那么继续下一步是没有意义的
重要
完成每个步骤后,检查最近的更改是否对先前步骤中所做的改进产生了负面影响。
在正常负载下达到所需的性能后,您可以选择在高负载下执行测试 stress-ng 或者 iperf。
检查硬件
不要对控制器的处理器核心使用共享缓存。
如果您为目标设备使用基于以太网的现场总线,则为其使用物理适配器。不要使用交换机架构。
设置 Linux
使用实时内核。
重要
在 Linux 上进行实时操作,请使用 Realtime PREEMPT 补丁。使用低延迟内核是不够的,因为它不能保证确定的实时属性
有关更多信息,请参阅以下内容:
以下许多系统设置也可以通过运行时系统直接使用 PLCShell 进行配置,也可以直接通过运行时系统的配置文件进行配置。某些系统设置不会在系统重启后持续存在。通过将设置输入到配置文件中,运行时系统启动时将自动恢复设置。运行相应的 PLCShell 命令还会将相应的条目添加到配置文件中
plcShell 命令
配置文件输入
函数
rt-get scaling_governor/kernelinfo/hyperthreading/throttling/napi <device>返回有关系统设置的信息
例 3. 示例rt-get scaling_governor显示可用的缩放调控器,并返回为内核配置的缩放调控器
rt-set scaling_governor <cpu_index> <value>[CmpLinuxRTDiag] ScalingGovernor.CPU0=performance
将特定内核或所有内核的缩放调控器设置为指定选项
例 4. 示例set scaling_governor all performancert-set hyperthreading <state>[CmpLinuxRTDiag] Hyperthreading=off
开启/关闭超线程
rt-set throttling <state>[CmpLinuxRTDiag] Throttling=off
开启/关闭节流功能
rt-set napi <device> <state>[CmpLinuxRTDiag] Napi=eno1
为网络适配器启用或禁用线程 NAPI
rt-clear-settings全部删除
rt-set配置文件中的设置rt-marker-set <taskname> <threshold>[CmpLinuxRTDiag] TraceMarker.TaskName=MainTask TraceMarker.ThresholdUs=100 [SysTask] Linux.MeasureInterval=1
当抖动超过指定限制时,允许为指定任务写入内核跟踪标记。
仅当运行时以 root 用户身份运行时才可用
rt-marker-disable禁用内核跟踪标记
rt-marker-get指定为内核跟踪标记和抖动限制配置的任务名称
irq-list列出所有可用的 IRQ、其优先级和系统上的关联性
irq-set-prio <no | device> <priority>[CmpLinuxInterrupt] Interrupt.1.Priority=51 Interrupt.1.Device=eno1
Sets the priority of interrupts specified either by number <no> or device <device> to the desired value
irq-set-affinity <no | device> <bitmask>[CmpLinuxInterrupt] Interrupt.1.Affinity=128 Interrupt.1.Device=eno1
Sets the core affinity of the interrupt specified either by number <no> or device <device> to the desired bitmask
irq-clear-settings全部删除
irq sets配置文件中的设置对于实时需求,需要使用 RT 抢占内核 (https://wiki.linuxfoundation.org/realtime/documentation/start) 适用于你的 Linux 系统。对于 Debian 和 Ubuntu 发行版,你会发现 RT 内核是一个软件包,你可以使用它轻松安装
apt命令。有关这方面的详细信息,请参阅您的发行版手册。在 Debian 系统上
sudo apt-get install linux-image-rt-amd64例如,使用命令检查你正在使用哪个内核
uname -a。
避免在系统上使用 Windows 管理器、GUI/X 服务器或类似工具。
使用这些工具可能会影响系统的实时功能,从而导致 IEC 应用程序出现高抖动。
测试
使用“rt-tools”:
安装“rt-tools”:
sudo apt install rt-tests开始“循环测试”:
sudo cyclictest -p 99 -t -m这
man cyclictest命令向您显示更多命令行选项,您可以使用它们更好地测量系统的更多或特定性能方面。
该值是否由下式确定 cyclictest 可以视为 “良好” 取决于您的硬件。如果您使用的是非常强大的处理器(例如,英特尔酷睿 i7),则最大值应为 1 位数的较低。如果你使用的是旧的 ARM 处理器,那么 100 可能是一个不错的结果。
优化选项
重要
更改每项设置或设置组合后,应运行 cyclictest 程序来验证变更的有效性。
这些设置不是永久性的,因此必须在系统启动或重新启动后重置。
注意
在 4.21.0.0 及更高版本中, CODESYS 提供了一个 PLC Shell 命令,该命令直接输出其中的大多数值。要执行此操作,请运行 system-creatertreport 命令。有关该命令的更多详细信息,请运行 system-creatertreport ?。
禁用 CPU 节能模式。
禁用超线程。
您可以使用以下命令禁用超线程(示例):
echo off | sudo tee /sys/devices/system/cpu/smt/control尽可能禁用 CPU 频率调整和切换。
例如,将最小和最大 CPU 频率设置为相同(固定)值。
禁用 Linux 内核的实时限制机制,因为这可能会导致系统抖动。
有关更多信息,请参阅以下内容: Linux 基金会:日程安排 — RT 节流
您可以使用以下命令禁用实时限制(示例):
echo -1 > /proc/sys/kernel/sched_rt_runtime_us检查并更改调度/缩放调控器。
检查使用的调度/缩放调控器:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
更改使用的调度/缩放调控器(如
root/admin) 到Performance:echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor # set it for all available cores: echo "performance" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor echo "performance" > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor echo "performance" > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor
请注意,每次启动系统时都必须重置缩放调控器。您也可以通过内核配置对其进行设置。
这个
intel_pstate内核驱动程序会使正确的设置变得更加困难。因此,你应该使用cpufreq-info命令检查您的配置。你也可以使用诸如此类的程序
cpu-freq-utils。这可能会干扰英特尔的 pstate 驱动程序。这些驱动程序通常需要不同的方法来设置 CPU 频率。有关更多信息,请参阅以下内容: https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt
禁用
HyperV在 BIOS 中(如果可用)。
配置 CODESYS-运行时系统
创建一个测试应用程序,大致描述您要优化系统的应用程序(在所需资源、所需性能和项目规模方面)。
您可以迭代地执行此操作:首先创建一个非常粗略的近似值,然后对其进行扩展以越来越接近实际应用程序。
测试
当应用程序运行时,检查任务配置。打开 任务配置 并选择 监视器 标签。

分钟。抖动 (μs) / 最大抖动(微秒)
平均周期时间(微秒)/最大周期时间周期时间 (µs) 周期时间 (µs)
最大周期不应接近配置的周期时间。一旦系统遇到高负载,这就会导致问题。
始终保持周期时间尽可能短。
优化选项
重要
更改每项设置或设置组合后,应运行 cyclictest 程序来验证变更的有效性。
将长时间运行的任务拆分为多个较小的任务。
运行时,最高优先级任务的最大循环时间不应达到配置的循环时间。如果无法避免这种情况,则应增加配置的周期时间以确保一致的执行时间。
启动现场总线系统(例如 EtherCAT 或 PROFINET)时,启动周期可能会导致 CPU 负载稍高。在这种情况下,在启动应用程序后不久监控 CPU 负载是有意义的。
以下选项无法更改 CODESYS Virtual Control SL,但需要在主机上配置:
设置值
DisableCpuDmaLatency至 1:[SysCpuHandling] Linux.DisableCpuDmaLatency=1
请注意,这是运行时版本 4.11.0.0 的默认设置。
要检查您的运行时版本,请单击 附加功能 → 更新Linux → 系统 → 系统信息。
验证是否确实在使用实时内核。
从版本 4.11.0.0 开始,您可以使用 PLC shell 命令
rt-get kernelinfo检查这个。如果您使用的是旧版本,则可以直接在命令行上使用以下命令进行测试
uname -a命令。如果未使用实时内核,则需要从头开始优化。
配置 IEC 应用程序
本节涉及您的实际应用。
测试
你可以做上一步的测试 配置 CODESYS-运行时系统 用于测试您的 IEC 应用程序。
优化选项
重要
更改每个设置或设置组合后,应运行“循环测试”程序来验证更改的有效性。
您可以使用 多核 特色于 CODESYS。
确定任务的正确优先级。重要的任务应该有更高的优先级。
表 6. IEC任务优先级和Linux线程优先级的映射:IEC 任务优先级
运行时优先级
Linux优先级
--
0
88(SCHED_FIFO)
--
31
57(SCHED_FIFO)
0(最高实时优先级)
32
56(SCHED_FIFO)
15(最低实时优先级)
47
41(SCHED_FIFO)
16(非实时优先级)
48
0 (SCHED_OTHER)
31(非实时优先级)
63
0 (SCHED_OTHER)
--
64
0 (SCHED_OTHER)
--
255
(SCHED_IDLE)
注意
传统的 Linux 系统上,大多数中断 (IRQ) 和内核工作程序的优先级为 Linux 50。使用上述优先级(高负载)可能会导致系统功能(网络/存储)无法按预期运行
您可以在相应的任务配置中配置任务的优先级。

如果在执行此处提到的所有步骤后仍未达到所需的性能,那么您可以查看以下部分:
现场总线特定信息
测试
检查
Send Time/Recv TimeEtherCAT 状态页面上的值。配备 Intel Core i7 处理器和良好适配器的 x64 CPU 的时间应该少于 10μs。
具有集成芯片的 ARM 处理器将具有约 50μs 或更长的时间。

检查
Send Time/Recv TimePROFINET 状态页上的值。配备 Intel Core i7 处理器和良好适配器的 x64 CPU 的时间应该少于 10μs。
具有集成芯片的 ARM 处理器将具有约 50μs 或更长的时间。

优化选项
要对优先级和所需的 IRQ 进行排序,您可以使用 PLC shell 命令
irq-list和irq-set-prio。这些命令使用正常的 Linux 优先级,而不是 IEC 优先级。
这种优化在以下情况下是不可能的 CODESYS Virtual Control SL,而是在主机系统上。
为设备使用单独的网络适配器。
有关更多信息,请参阅:
[针对专家] – 其他工具和主题
本节中描述的工具和选项适用于高级用户。由于要采取的行动在很大程度上取决于具体的系统,因此需要进行独立研究。因此,我们无法为您提供任何具体的解决方案。
KernelShark / 内核跟踪
如果您发现日程安排是性能问题的原因,那么这是您的首选程序。使用 “内核跟踪”,您可以检查您的任务是否被其他任务、服务或中断中断
trace-cmd record -p function您可以使用 KernelShark 检查生成的
trace.dat文件。
一般来说,调度问题可以分为两类:
取代/抢占
如果不需要中断或阻止执行的任务,则禁用它。
提高您的任务的优先级或降低其他任务的优先级。
切换到不同的 CPU 核心。
重要
使用上一章中描述的程序验证更改的有效性。
执行时间
请参阅下面的 “内核函数跟踪”
内核函数跟踪
如果代码执行时间太快,你可以使用这个工具来查明问题
如果执行时间太长的函数在您自己的代码中,那么您需要对其进行优化。
如果该函数太慢而无法在内核中执行,你可以尝试使用另一个内核函数来实现所需的功能。或者,你可以将配置参数传递给内核驱动程序以缩短执行时间
如果这些选项都不能解决问题,则可能需要使用更强大的硬件。
使用以下几点来验证是否包含实现绩效目标的正确工具:
PREEMPT_FULL
独立CPU
rcu_nocbs
rcu_nocb_poll
无软锁定
中断平衡禁用
kernel.sched_rt_runtime_us